from sqlalchemy import create_engine
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy import Column, Integer, String
from sqlalchemy.orm import sessionmaker
import os
# print(sqlalchemy.__version__)


'''
SQLAlchemy 通过 Engine 来驱动，从图中可以看出 Engine 内维护了一个连接池（Pool）和方言（Dialect），
Pool 就是用来存放连接的，Dialect 是用来判断要连接的是哪种数据库，我们创建连接要先创建 Engine，然后再通过 Engine 来创建连接。
'''
# 相对路径方式
# engine = create_engine('sqlite:///foo.db')
# 绝对路径方式
# engine = create_engine('sqlite:///E:\\pycharmProject\\python100days\\day86\\foo.db')
basedir= os.path.abspath(os.path.dirname(__file__))

# 创建 Engine echo=True 会将执行语句打印出来，默认为 False；数据库（foo.db）不存在会自动创建
engine = create_engine('sqlite:///'+ os.path.join(basedir, 'data.sqlite'), echo=True)
# 创建连接
# conn = engine.connect()

# todo 其他数据库
'''
echo：值为 True 将执行语句打印出来，默认为 False。
pool_size：连接池的大小，默认为 5，0 表示连接数无限制。
pool_recycle：设置了 pool_recycle 后，SQLAlchemy 会在指定时间内回收连接，单位为秒。
'''
# engine = create_engine('mysql://root:LongTao1314%@118.24.27.37:3306/test',
#                        echo=True,
#                        pool_size=10,
#                        pool_recycle=3600)
conn = engine.connect()

# 创建表 表的创建通过映射类的方式实现，首先创建映射基类，后面的类需要继承它
Base = declarative_base()
# 具体映射类
class SysUser(Base):
    # 指定映射表名
    __tablename__ = 'sys_user'

    # id 设置为主键
    id = Column(Integer, primary_key=True)
    # 指定 name 映射到 name 字段
    name = Column(String(30))
    password = Column(String(32))
#
# # 创建表
# Base.metadata.create_all(engine)

# 建立会话
Session = sessionmaker(bind=engine)
# 创建 Session 类实例
session = Session()

# todo 添加
# 新增
# su = SysUser(id=4, name='lt4', password="123456")
# # 保存
# session.add(su)
# # 提交
# session.commit()

# todo 查询
# u = session.query(SysUser).filter(SysUser.id==1).one()
# print('name-->%s' % u.name)
# 查询所有数据
# u = session.query(SysUser).filter(SysUser.password=='123456').all()
# for i in u:
#     print('name-->%s' % i.name)

# todo 修改
# u = session.query(SysUser).filter(SysUser.id==1).one()
# print('修改前名字-->', u.name)
# u.name = 'James'
# session.commit()
# u = session.query(SysUser).filter(SysUser.id==1).one()
# print('修改后名字-->', u.name)

# todo 删除
# u = session.query(SysUser).filter(SysUser.id==2).one()
# session.delete(u)
# session.commit()
# # 查询所有数据
# u = session.query(SysUser).filter(SysUser.password=='123456').all()
# for i in u:
#     print('name-->%s' % i.name)

# 关闭
session.close()